package aerolineas;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import asientos.Asiento;
import asientos.ClaseDeAsiento;
import asientos.ClaseDeAsientoEjecutiva;
import asientos.ClaseDeAsientoIncorrectaException;
import asientos.ClaseDeAsientoPrimera;
import asientos.ClaseDeAsientoTurista;
import busquedas.CriteriosBusqueda;

import com.lanchita.AerolineaLanchita;
import com.lanchita.excepciones.LanchitaException;


/**
 * Con este adapter acomodamos la aerolinea lanchita a la interfaz que esperamos.
 */
public class LanchitaAdapter implements Aerolinea {
	private AerolineaLanchita aerolinea;
	private static String PORCENTAJE_IMPUESTOS="0.15";
	
	public LanchitaAdapter() {
		this.aerolinea=AerolineaLanchita.getInstance();
	}
	
	@Override
	public List<Asiento> asientosDisponibles(CriteriosBusqueda criterios) {
		List<Asiento> asientos = new ArrayList<Asiento>();
		
		String[][] asientosDisponibles=this.aerolinea.asientosDisponibles(
				criterios.getOrigen(), 
				criterios.getDestino(), 
				criterios.getFechaSalida().asString("lanchita"), 
				criterios.getHoraSalida(), 
				criterios.getFechaLlegada().asString("lanchita"), 
				criterios.getHoraLlegada());
		
		/* Devolvemos todos los asientos disponibles. */
		for(String[] unAsiento : asientosDisponibles) {
			asientos.add(new Asiento(
					unAsiento[0], 
					new BigDecimal(unAsiento[1]).add(new BigDecimal(unAsiento[1]).multiply(new BigDecimal(PORCENTAJE_IMPUESTOS))), //Precio de la aerolinea + el impuesto
					this.createClaseDeAsiento(unAsiento[2]), 
					unAsiento[3], 
					unAsiento[4]));
		}
		
		return asientos;
	}

	private ClaseDeAsiento createClaseDeAsiento(String clase) throws ClaseDeAsientoIncorrectaException {
		if (clase == "T") {
			return new ClaseDeAsientoTurista();
		}
		else if (clase == "E") {
			return new ClaseDeAsientoEjecutiva();
		}
		else if (clase == "P") {
			return new ClaseDeAsientoPrimera();
		}
		else {
			throw new ClaseDeAsientoIncorrectaException();			
		}
	}
 
	public void comprarAsiento(String codigoAsiento){
		try{
			aerolinea.comprar(codigoAsiento);	
		}
		catch (LanchitaException e) {
			throw new AsientoNoDisponibleException(codigoAsiento);
		}
	}

}
